﻿Public Class businessOS
    Public Function AltaOrdeServicio(ByVal OS As clsOrden_Servicio) As Boolean
        Dim OSDao As New daoOrden_Servicio()
        Dim OSDet As New clsOrden_Servicio_Detalle()
        Dim osDetDao As New daoOrden_Servicio_Detalle()
        Try
            If OSDao.Alta(OS) Then
                OSDet = OS.Detalle.Item(0)
                If osDetDao.Alta(OSDet) Then
                    Return True
                Else
                    Throw New Exception("No se pudo dar de alta el detalle de la OS")
                End If
            Else
                Throw New Exception("No se pudo dar de alta la OS")
            End If
        Catch ex As Exception
        Finally
            OSDao.Dispose()
            OSDet.Dispose()
            osDetDao.Dispose()
        End Try
    End Function

    Public Function TraeOrdenesServicioAsignable(ByVal nro_OC As Int32, ByVal FecDesde As Date, ByVal FecHasta As Date) As List(Of clsOrden_Servicio)
        Dim ListaOS As New List(Of clsOrden_Servicio)
        Dim OSDao As New daoOrden_Servicio()
        Dim Os As New clsOrden_Servicio()
        Try
            '' Busco primero por nro OS
            If nro_OC > 0 Then
                Os = OSDao.TraeOrdenServicio(nro_OC)
            End If
            ''Si encontro una orden de servicio, la pongo en mla lista y finalizo, sino sigo y busco por fechas
            If Os.Os_Id > 0 Then
                If Os.Os_Estado < 7 Then
                    ListaOS.Add(Os)
                    Return ListaOS
                Else
                    Return ListaOS
                End If
            Else
                ListaOS = OSDao.TraeOrdenesServicioAsignable(FecDesde, FecHasta)
                Return ListaOS
            End If

        Catch ex As Exception

        Finally
            OSDao.Dispose()
            Os.Dispose()
        End Try
        Return ListaOS
    End Function

    Public Function AsignarTecnico(ByVal OS As clsOrden_Servicio, ByVal TEcnico As clsEmpleado, ByVal Observaciones As String) As Boolean
        Dim OSDet As New clsOrden_Servicio_Detalle()
        Dim OSDetDao As New daoOrden_Servicio_Detalle()
        Dim OSDao As New daoOrden_Servicio()

        Try
            OS.Os_Estado = 2
            OS.Tec_Id = TEcnico.Emp_Id

            If OSDao.Modificar(OS) Then
                OSDet.Os_Id = OS.Os_Id
                OSDet.Descri = Observaciones
                OSDet.Osdte_Estado = 2
                OSDet.Cod_Suc = Configuracion.Cod_Suc
                OSDet.Osdte_Id = Numerador.TraeProximo("ORDEN_SERVICIO_DETALLE")
                If OSDetDao.Alta(OSDet) Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Catch ex As Exception
        Finally
            OSDao.Dispose()
            OSDet.Dispose()
            OSDetDao.Dispose()
        End Try
        Return True
    End Function

    Public Function ReAsignarTecnico(ByVal OS As clsOrden_Servicio, ByVal TEcnico As clsEmpleado, ByVal Observaciones As String) As Boolean
        Dim OSDet As New clsOrden_Servicio_Detalle()
        Dim OSDetDao As New daoOrden_Servicio_Detalle()
        Dim OSDao As New daoOrden_Servicio()

        Try
            OS.Tec_Id = TEcnico.Emp_Id

            If OSDao.Modificar(OS) Then
                OSDet.Osdte_Id = Numerador.TraeProximo("ORDEN_SERVICIO_DETALLE")
                OSDet.Os_Id = OS.Os_Id
                OSDet.Descri = Observaciones
                OSDet.Osdte_Estado = 2
                OSDet.Cod_Suc = Configuracion.Cod_Suc
                If OSDetDao.Alta(OSDet) Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Catch ex As Exception
        Finally
            OSDao.Dispose()
            OSDet.Dispose()
            OSDetDao.Dispose()


        End Try
        Return True
    End Function

    Public Function TraeOrdenesServicioTEcnicos(ByVal nro_OC As Int32, ByVal FecDesde As Date, ByVal FecHasta As Date) As List(Of clsOrden_Servicio)
        Dim ListaOS As New List(Of clsOrden_Servicio)
        Dim OSDao As New daoOrden_Servicio()
        Dim Os As New clsOrden_Servicio()
        Try
            '' Busco primero por nro OS
            If nro_OC > 0 Then
                Os = OSDao.TraeOrdenServicio(nro_OC)
            End If
            ''Si encontro una orden de servicio, la pongo en mla lista y finalizo, sino sigo y busco por fechas
            If Os.Os_Id > 0 Then
                If (Os.Os_Estado = 2 Or Os.Os_Estado = 3 Or Os.Os_Estado = 4 Or Os.Os_Estado = 6 Or Os.Os_Estado = 8) Then
                    ListaOS.Add(Os)
                    Return ListaOS
                Else
                    Return ListaOS
                End If
            Else
                ListaOS = OSDao.TraeOrdenesServicioParaTecnico(FecDesde, FecHasta)
                Return ListaOS
            End If

        Catch ex As Exception

        Finally
            OSDao.Dispose()
            Os.Dispose()
        End Try
        Return ListaOS
    End Function

    Public Function TraeOrdenesServicioVendedor(ByVal nro_OC As Int32, ByVal FecDesde As Date, ByVal FecHasta As Date) As List(Of clsOrden_Servicio)
        Dim ListaOS As New List(Of clsOrden_Servicio)
        Dim OSDao As New daoOrden_Servicio()
        Dim Os As New clsOrden_Servicio()
        Try
            '' Busco primero por nro OS
            If nro_OC > 0 Then
                Os = OSDao.TraeOrdenServicio(nro_OC)
            End If
            ''Si encontro una orden de servicio, la pongo en mla lista y finalizo, sino sigo y busco por fechas
            If Os.Os_Id > 0 Then
                If (Os.Os_Estado = 3 Or Os.Os_Estado = 5) Then
                    ListaOS.Add(Os)
                    Return ListaOS
                Else
                    Return ListaOS
                End If
            Else
                ListaOS = OSDao.TraeOrdenesServicioParaVendedor(FecDesde, FecHasta)
                Return ListaOS
            End If

        Catch ex As Exception

        Finally
            OSDao.Dispose()
            Os.Dispose()
        End Try
        Return ListaOS
    End Function

    Public Function ValidaCambioEstado(ByVal OS As clsOrden_Servicio, ByVal EstadoNuevo As clsEstado_Os) As Boolean
        '1 - PENDIENTE
        '2 - ASIGNADA
        '3 - DIAGNOSTICADA
        '4 - IRREPARABLE
        '5 - REPADADA
        '6 - INCOMPLETA
        '7 - COBRADA
        '8 - ACEPTADA
        '9 - ABANDONADA
        '10 - RECHAZADA

        ''Si esta Pendiente solo puede pasar a asignada
        If OS.Os_Estado = 1 And EstadoNuevo.EstadoOs_Id = 2 Then
            Return True
        End If

        ''Si esta Asignada puede pasar a Diagnosticada/Irreparable
        If OS.Os_Estado = 2 Then
            Select Case EstadoNuevo.EstadoOs_Id
                Case 3
                    Return True
                Case 4
                    Return True
            End Select
        End If

        ''Si esta diagnosticada puede pasar a Aceptada/Abandonada/rechazada
        If OS.Os_Estado = 3 Then
            Select Case EstadoNuevo.EstadoOs_Id
                Case 8
                    Return True
                Case 9
                    Return True
                Case 10
                    Return True
            End Select
        End If

        ''Si esta en estado irreparable no puede cambiar de estado
        If OS.Os_Estado = 4 Then
            Return False
        End If

        ''Si esta reparada puede pasar a Abandonada/Cobrada
        If OS.Os_Estado = 5 Then
            Select Case EstadoNuevo.EstadoOs_Id
                Case 7
                    Return True
                Case 9
                    Return True
            End Select
        End If

        ''Si esta incompleta solo puede pasar a reparada
        If OS.Os_Estado = 6 And EstadoNuevo.EstadoOs_Id = 5 Then
            Return True
        End If

        ''Si esta en estado cobrada no puede cambiar de estado
        If OS.Os_Estado = 7 Then
            Return False
        End If

        ''Si esta aceptada puede pasar a reparada/incompleta
        If OS.Os_Estado = 8 Then
            Select Case EstadoNuevo.EstadoOs_Id
                Case 5
                    Return True
                Case 6
                    Return True
            End Select
        End If

        ''Si esta en estado abandonada no puede cambiar de estado
        If OS.Os_Estado = 9 Then
            Return False
        End If

        ''Si esta en estado rechazada no puede cambiar de estado
        If OS.Os_Estado = 10 Then
            Return False
        End If

        Return False
    End Function

    Public Function ActualizoStockConsumido(ByVal OS As clsOrden_Servicio) As Boolean
        Dim ListaOSDetalle As New List(Of clsOrden_Servicio_Detalle)
        Dim ListaOsConsumo As New List(Of clsOrden_Servicio_Consumos)
        Dim Producto As New clsCatalogo()
        Dim ProductoBusiness As New businessCatalogo()

        Try
            Dim i As Int32
            Dim j As Int32
            ListaOSDetalle = OS.Detalle
            For i = 0 To ListaOSDetalle.Count - 1
                ListaOsConsumo = ListaOSDetalle.Item(i).Consumos
                For j = 0 To ListaOsConsumo.Count - 1
                    Producto = ListaOsConsumo.Item(j).Producto
                    ProductoBusiness.ActualizaStock(Producto, -1)
                Next
            Next
        Catch ex As Exception
        Finally
            Producto.Dispose()
            ProductoBusiness.Dispose()
        End Try
        Return True
    End Function

    Public Function ConsultaOS(ByVal OS_Id As Int32, ByVal FecDesde As Date, ByVal FecHasta As Date, ByVal Importe As Decimal, ByVal Estado As Int32, ByVal Tipo As Int32, ByVal Cod_Suc As Int32, ByVal Tecnico As Int32) As List(Of clsOrden_Servicio)
        Dim ListaOS As New List(Of clsOrden_Servicio)
        Dim OSDao As New daoOrden_Servicio()

        Try
            ''si ingreso Nro OS bsuco por numero
            Dim OS As New clsOrden_Servicio()
            If OS_Id > 0 Then
                OS = OSDao.TraeOrdenServicio(OS_Id)
            End If
            If OS.Os_Id > 0 Then
                ListaOS.Add(OS)
                Return ListaOS
            End If

            Dim Cn As New SqlClient.SqlConnection
            Dim Cm As New SqlClient.SqlCommand
            Dim Dr As SqlClient.SqlDataReader
            Dim ListaOrden_Servicio As New List(Of clsOrden_Servicio)
            Dim StringSelect As String
            Dim StrinWhere As String

            Try
                Cn.ConnectionString = My.Resources.Conexion
                Cn.Open()
                Cm.CommandType = CommandType.Text

                StringSelect = "Select os_id, tipo_os, os_fecha_inicio, os_fecha_fin, " & _
                                 "tec_id, cli_id, os_estado, os_importe, Cod_Suc " & _
                                 "from orden_servicio "


                StrinWhere = "where Cod_Suc = " & Cod_Suc.ToString.Trim & " AND " & _
                             "os_fecha_inicio between '" & FecDesde.ToString & "' AND '" & _
                             FecHasta.ToString & "'"

                If Estado < 99 Then
                    StrinWhere = StrinWhere & " AND os_estado = " & Estado.ToString.Trim
                End If

                If Tipo < 99 Then
                    StrinWhere = StrinWhere & " AND tipo_os = " & Tipo.ToString.Trim
                End If

                If Tecnico < 99 Then
                    StrinWhere = StrinWhere & " AND tec_id = " & Tecnico.ToString.Trim
                End If

                If Importe > 0 Then
                    StrinWhere = StrinWhere & " AND os_importe = " & Importe.ToString.Trim
                End If

                Cm.CommandText = StringSelect & StrinWhere
                Cm.Connection = Cn
                Dr = Cm.ExecuteReader
                If Dr.HasRows = True Then
                    While Dr.Read
                        Dim Orden_Servicio As New clsOrden_Servicio()
                        Orden_Servicio.Os_Id = Dr.GetInt32(0)
                        Orden_Servicio.Tipo_Os = Dr.GetInt32(1)
                        Orden_Servicio.Os_Fecha_Inicio = Dr.GetDateTime(2)

                        If Dr.IsDBNull(3) Then
                            Orden_Servicio.Os_Fecha_Fin = Convert.ToDateTime("01/01/1999")
                        Else
                            Orden_Servicio.Os_Fecha_Fin = Dr.GetDateTime(3)
                        End If

                        If Dr.IsDBNull(4) Then
                            Orden_Servicio.Tec_Id = 0
                        Else
                            Orden_Servicio.Tec_Id = Dr.GetInt32(4)
                        End If

                        If Dr.IsDBNull(5) Then
                            Orden_Servicio.Cli_Id = 0
                        Else
                            Orden_Servicio.Cli_Id = Dr.GetInt32(5)
                        End If

                        Orden_Servicio.Os_Estado = Dr.GetInt32(6)
                        Orden_Servicio.Os_Importe = Dr.GetDecimal(7)
                        Orden_Servicio.Cod_Suc = Dr.GetInt32(8)

                        Dim Estado_OsDao As New daoEstado_Os()
                        Orden_Servicio.Estado = Estado_OsDao.TraeEstadoOrdenServicio(Orden_Servicio.Os_Estado)
                        Estado_OsDao.Dispose()

                        Dim Tipo_OsDao As New daoTipo_Os()
                        Orden_Servicio.Tipo = Tipo_OsDao.TraeTipoOrdenServicio(Orden_Servicio.Tipo_Os)
                        Tipo_OsDao.Dispose()

                        If (Orden_Servicio.Tec_Id > 0) Then
                            Dim Empleado_Dao As New daoEmpleado()
                            Orden_Servicio.Empleado = Empleado_Dao.TraeEmpleadoCodSuc(Orden_Servicio.Tec_Id, Cod_Suc)
                            Estado_OsDao.Dispose()
                        Else
                            Orden_Servicio.Empleado = New clsEmpleado()
                        End If

                        If (Orden_Servicio.Cli_Id > 0) Then
                            Dim Cliente_Dao As New daoCliente()
                            Orden_Servicio.Cliente = Cliente_Dao.TraeClienteCodSuc(Orden_Servicio.Cli_Id, Cod_Suc)
                            Estado_OsDao.Dispose()
                        Else
                            Orden_Servicio.Cliente = New clsCliente()
                        End If

                        Dim ListaDetalle_OS As New List(Of clsOrden_Servicio_Detalle)
                        Dim Detalle_OS_Dao As New daoOrden_Servicio_Detalle()
                        ListaDetalle_OS = Detalle_OS_Dao.TraeDetallesOrdenServicioCodSuc(Orden_Servicio.Os_Id, Cod_Suc)
                        Orden_Servicio.Detalle = ListaDetalle_OS
                        Detalle_OS_Dao.Dispose()

                        ListaOrden_Servicio.Add(Orden_Servicio)
                        Orden_Servicio.Dispose()
                    End While

                    Dr.Close()
                    Cn.Close()
                End If
                Return ListaOrden_Servicio
            Catch ex As Exception
                Throw New Exception(ex.Message)
            Finally
                Cn.Dispose()
                Cm.Dispose()
            End Try
        Catch ex As Exception
            Return ListaOS
            Throw New Exception(ex.Message)
        Finally
            OSDao.Dispose()
        End Try
    End Function

    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub Dispose()
        MyBase.Finalize()
    End Sub

End Class
